package jp.seraph.cui;

/**
 * SystemNodeの型を表すインターフェース
 *
 */
public interface SystemNodeType {
    public String getName();

    public boolean equals(SystemNodeType aType);

    /**
     * この型が、引数の型として扱えるかどうか。
     * このメソッドがtrueを返す場合、引数の型である変数に、この型を持つインスタンスを代入可能。
     * 今のところ変数は、Commandの引数にしか存在しません。
     *
     * @param aType
     * @return
     */
    public boolean isCompatible(SystemNodeType aType);

    /**
     * 引数のSystemNodeが、この型のオブジェクトとして扱えるかどうか。
     * このメソッドがtrueを返す場合、この型の変数に、引数のオブジェクトを代入可能。
     * 今のところ変数は、Commandの引数にしか存在しません。
     *
     * @param aNode
     * @return
     */
    public boolean isInstance(SystemNode aNode);

    /**
     * TypeがModeと互換性があるかどうか。 このメソッドがtrueを返す場合、元になったインスタンスはModeにキャスト可能でなければならない。
     *
     * @return
     * @see jp.seraph.same.view.Mode
     */
    public boolean isMode();

    /**
     * TypeがDataと互換性があるかどうか このメソッドがtrueを返す場合、元になったインスタンスはDataにキャスト可能でなければならない。
     *
     * @return
     * @see jp.seraph.same.view.Data
     */
    public boolean isData();

    /**
     * TypeがCommandと互換性があるかどうか
     * このメソッドがtrueを返す場合、元になったインスタンスはCommandにキャスト可能でなければならない。
     *
     * @return
     * @see jp.seraph.same.view.Command
     */
    public boolean isCommand();
}
